<?php
declare(strict_types=1);
// 商品档案-前台POS专用
namespace app\pos_v1\controller;

use think\facade\Db; //门面模式
use app\pos_v1\model\GoodsPos as mysql; //导入模型

class GoodsPos
{
    // HTTP请求
    function curl_HTTP($url, $header, $pos_db)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);  // 从证书中检查SSL加密算法是否存在
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, 0); //如果想把一个头包含在输出中，设置这个选项为一个非零值。
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //如果成功只将结果返回，不自动输出任何内容。
        curl_setopt($ch, CURLOPT_POST, 1); //设置为POST方式
        curl_setopt($ch, CURLOPT_POSTFIELDS, $pos_db); //POST数据
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
        curl_setopt($ch, CURLINFO_HEADER_OUT, 1); //启用时追踪句柄的请求字符串。
        $response = curl_exec($ch);
        //dump(curl_error($ch));  //查看报错信息
        // 写文件
        // file_put_contents('ajs/web_api_' . date('Y-m-d_H-i-s', time()) . '.json', $response . "\n", FILE_APPEND);
        curl_close($ch);
        return $response;
    }
    // 扫码查询商品列表-POS销售
    public function GoodsPosX()
    {
        // 精准查询 qty=precise 查字段 barcode
        // 模糊查询 qty=blurry 查字段 code_x
        $qty = request()->param('qty', '', 'trim');
        $code_x = request()->param('code_x', '', 'trim');
        //验证规则
        $requestdb = [
            'qty' => $qty,
            'code_x' => $code_x,
        ];
        $validate = new \app\pos_v1\validate\GoodsPos; //验证规则
        if (!$validate->check($requestdb)) {
            // 验证不过关提示
            $apidb = [
                'code' => 201, //状态码
                'msg' => "请求参数有误-" . $validate->getError(),
                'requestdb' => $requestdb,
                'validate' => $validate->getError(),
            ];
            return json($apidb);
        }
        if ($qty == "precise") {
            // 精准查询
            $sql_where = [
                ['barcode', 'like', '%' . $code_x],
            ];
        } elseif ($qty == "blurry") {
            // 模糊查询
            if ($code_x == "") {
                $apidb = [
                    'code' => 203, //状态码
                    'msg' => "参数错误-空", //状态信息
                    'query' => request()->param(), //请求参数
                    'db' => [],
                ];
                return (json($apidb));
            } else {
                $sql_where = [
                    ['code_x', 'like', '%' . $code_x . "|%"], //字段值分隔符|例子：123|3323|kk23|3332|，前端要传|左边第一个起
                ];
            }
        } else {
            $apidb = [
                'code' => 202, //状态码
                'msg' => "参数错误-溢出", //状态信息
                'query' => request()->param(), //请求参数
                'db' => [],
            ];
            return (json($apidb));
        }
        $sqldb = mysql::where($sql_where)->select();
        //设置需要输出的属性
        $sqldb = $sqldb->visible([
            // 'db_json', //主键
        ]);
        // 设置需要隐藏的输出属性
        $sqldb = $sqldb->hidden([
            //     'db_json', //主键
        ]);
        // 设置需要附加的输出属性
        $sqldb = $sqldb->append([
            'json_db', //附加字段-多包装单位商品包
        ]);
        // 设置数据字段获取器
        $sqldb = $sqldb->withAttr('unit_pack', function ($value, $data) {
            $res = ["A" => '是', "B" => '否'];
            return ["val" => $value, "mp" => $res[$value], "txt" => "是否大单位"];
        });
        $sqldb = $sqldb->withAttr('time_new', function ($value, $data) {
            return ["val" => $value, "mp" => date('Y-m-d H:i:s', $value), "txt" => "创建时间"];
        });
        $sqldb = $sqldb->withAttr('time_up', function ($value, $data) {
            return ["val" => $value, "mp" => date('Y-m-d H:i:s', $value), "txt" => "修改时间"];
        });
        if ($sqldb->isEmpty()) {
            $isEmpty = true; //数据集为空
            $count = 0; //数据集行数
            $sqldb = []; //数据集
        } else {
            $isEmpty = false;
            $count = count($sqldb); //数据集行数
            $sqldb = $sqldb->toArray(); //数据集-以数组方式返回
            for ($i = 0; $i < count($sqldb); $i++) {
                $sqldb[$i]["json_db"] = json_decode($sqldb[$i]["db_json"]);
                unset($sqldb[$i]["db_json"]);
            }
        }
        ;
        if ($isEmpty) {
            $msg = '查询失败-对应商品不存在';
            $code = 201;
        } else {
            $msg = '扫码查询商品';
            $code = 200;
        }
        $apidb = [
            'code' => $code, //状态码
            'msg' => $msg, //状态信息
            'query' => request()->param(), //请求参数
            'count' => $count, //数据集行数
            'db' => $sqldb,
            // 'getLastSql' => db::getLastSql(),
        ];
        return (json($apidb));
    }

    // 从远程库下载前台POS专用商品档案到本地数据库
    public function GoodsPosSync()
    {
        $url = 'http://127.0.0.1:81/admin1/GoodsPos/GoodsPos';
        // 请求头
        $header = [
            "Format:json",
            "charset=utf-8",
            "Content-Type: application/json",
            "Authorization:sn"
        ];
        // 请求数据包
        $pos_db = [
            'userid' => "1000034443",
        ];
        // 远程HTTP
        $result = $this->curl_HTTP($url, $header, json_encode($pos_db));
        $curl_db = json_decode($result, true); //转成数组
        // if (!is_array($curl_db)) {
        //     dump($result);
        //     exit;
        // }

        // 无条件删除所有数据
        Db::name('pos__i_goods')->delete(true);
        for ($i = 0; $i < count($curl_db["db"]); $i++) {
            $insert_data[$i]["dbid"] = $curl_db["db"][$i]["dbid"];
            $insert_data[$i]["unit_pack"] = $curl_db["db"][$i]["unit_pack"]; //是否大单位_A是B否
            $insert_data[$i]["unit_goods_dbid"] = $curl_db["db"][$i]["unit_goods_dbid"]; //大单位父商品数据编号(基本单位等于自己)
            $insert_data[$i]["time_new"] = $curl_db["db"][$i]["time_new"]; //计算属性-创建时间
            $insert_data[$i]["time_up"] = $curl_db["db"][$i]["time_up"]; //计算属性-修改时间
            $insert_data[$i]["code_x"] = $curl_db["db"][$i]["code_x"]; //SQL模糊查询码
            $insert_data[$i]["db_json"] = $curl_db["db"][$i]["db_json"]; //静态JSON
            $insert_data[$i]["barcode"] = $curl_db["db"][$i]["barcode"]; //主条码
            $insert_data[$i]["pos_show"] = $curl_db["db"][$i]["pos_show"]; //快捷商品显示
            $insert_data[$i]["time_sync"] = time(); //计算属性-同步时间
            // dump($db["db"][$i]);
        }
        //分批写入每次最多100条数据
        $sql_insert = Db::name('pos__i_goods')
            ->strict(false)
            ->limit(100)
            ->insertAll($insert_data);
        $curl_db["db"] = [];
        $db = [
            "api_info" => [
                'code' => 200, //状态码
                'time' => time(),
                'msg' => "从后台ADMIN下载前台POS专用商品档案到本地数据库-成功！", //状态信息
                'insert_count' => $sql_insert, //写入行
                "serve_info" => $curl_db,//服务器回调信息

            ],
        ];
        $insert_data = [];
        return (json($db));
    }
}
